package com.zzyy.study;

import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @auther zzyy
 * @create 2021-11-14 16:39
 */
public class Note
{

    public void test01()
    {

        /**
         * 当 OrderService 类的submitOrder方法上不添加注解,而ProductServis类的updateProductStockCountByl方法中添加
         * @Transactional( propagation = Propagahn REQUIRED )注解,并且 ProductService类的updateProductStockCountByl方法抛出异常时,
         *
         * OrderService类的submitOrder()方法                    执行成功向数据库插入了订单信息。
         * ProductService类的updateProductStockCountByld()方法  执行失败抛出异常并没有扣减库仔。
         *
         * 总结:
         * 外部方法无事务注解,内部方法添加REQUIRED事务传播类型时,
         * 内部方法抛出异常。内部方法执行失败不扣减库存,不会影响外部方法的执行,外部方法执行成功插入订单。
         *
         * 严重bug：下单成功，库存未减
         */
    }

    public void test02()
    {
        /**
         * OrderService类的submitOrder()方法上添加@Transactional(propagation=Propagation.REQUIRED )注解
         * 而ProductService类上的updateProductStockCountById()方法不添加事务注解且抛出异常时，
         * OrderService类的submitOrder()方法和ProductService类上的updateProductStockCountById()方法，
         * 两个都执行失败。
         *
         * 总结:
         * 外部方法添加 REQUIRED 事务传播类型,
         * 内部方法无事务注解时,
         * 内部方法抛出异常,会影响外部方法的执行,导致外部方法的事务回滚，最终2个都失败。
         */
    }

    public void test03()
    {
        /**
         * OrderService类的submitOrder()方法上添加@Transactional(propagation=Propagation.REQUIRED )注解
         * 而ProductService类上的updateProductStockCountById()方法上添加@Transactional(propagation=Propagation.REQUIRED )注解
         * ProductService类上的updateProductStockCountById()抛出异常时，
         * 两个都执行失败。
         *
         * 总结:
         * 外部方法添加 REQUIRED 事务传播类型,
         * 内部方法添加 REQUIRED 事务传播类型,
         * 内部方法抛出异常,会影响外部方法的执行,导致外部方法的事务回滚，最终2个都失败。
         */
    }

    public void test04()
    {
        /**
         * OrderService类的submitOrder()方法上添加@Transactional(propagation=Propagation.REQUIRED )注解
         * ProductService类上的updateProductStockCountById()方法上添加@Transactional(propagation = Propagation.NOT_SUPPORTED)
         * ProductService类上的updateProductStockCountById()抛出异常时，
         *
         *OrderService类的submitOrder()方法,执行失败；
         *ProductService类上的updateProductStockCountById()方法，执行成功，库存扣减1个
         * 总结:
         * 外部方法添加 REQUIRED 事务传播类型,
         * 内部方法添加 NOT_SUPPORTED 事务传播类型,
         * 内部方法抛出异常,
         * 如果外部成功事务会提交，如果外部失败事务会回滚。
         */
    }

    public void test05()
    {
        /**
         * OrderService类的submitOrder()方法上添加@Transactional(propagation=Propagation.REQUIRED )注解
         * ProductService类上的updateProductStockCountById()方法上添加@Transactional(propagation = Propagation.REQUIRES_NEW)
         * ProductService类上的updateProductStockCountById()抛出异常时，
         *
         * 两个都执行失败。
         * 总结:
         * 外部方法添加 REQUIRED 事务传播类型,
         * 内部方法添加 REQUIRES_NEW 事务传播类型,
         * 内部方法抛出异常,
         * 两个都失败。
         */
    }

    public void test06()
    {
        /**
         * OrderService类的submitOrder()方法上添加@Transactional(propagation=Propagation.REQUIRED )注解
         * 且尾部有int age = 10/0有异常，
         * ProductService类上的updateProductStockCountById()方法上添加@Transactional(propagation = Propagation.REQUIRES_NEW)
         * 且去掉int i = 10/0;
         *
         * ProductService类上的updateProductStockCountById()抛出异常时，OrderService类的submitOrder()方法失败，事务回滚
         * ProductService类上的updateProductStockCountById()执行成功时，OrderService类的submitOrder()方法失败，事务成功
         *
         * 总结:
         * 外部方法添加 REQUIRED 事务传播类型,
         * 内部方法添加 REQUIRES_NEW 事务传播类型,且把异常移动到外部方法尾部
         *
         * 内部方法抛出异常,外部方法执行失败，事务回滚，
         * 内部方法执行成功,事务提交。
         */
    }

    public void test07()
    {
        /**
         * OrderService类的submitOrder()方法上添加@Transactional(propagation=Propagation.REQUIRED )注解
         * 且尾部有int age = 10/0有异常，
         * 且调用本类的updateProductStockCountById()方法上添加@Transactional(propagation = Propagation.REQUIRES_NEW)
         *
         * 总结:
         * 外部方法添加 REQUIRED 事务传播类型,
         * 内部方法添加 REQUIRES_NEW 事务传播类型,且把异常移动到外部方法尾部，且外部方法和内部方法都在同一个类中
         *
         * 内部方法抛出异常,内部外部方法执行失败，事务回滚，
         */
    }
}
